package com.znf4.utils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.model.BatchSmsAttributes;
import com.aliyun.mns.model.MessageAttributes;
import com.aliyun.mns.model.RawTopicMessage;
import com.aliyun.mns.model.TopicMessage;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

/**
 * 类功能说明：阿里大鱼短信接口
 */
public class SmsUtil {

	private static final Log LOG = LogFactory.getLog(SmsUtil.class);

	/*************************** 大鱼基本信息 **********************************/

	// 产品名称:云通信短信API产品,开发者无需替换
	static final String product = "Dysmsapi";
	// 产品域名,开发者无需替换
	static final String domain = "dysmsapi.aliyuncs.com";
	static final String accessKeyId = "LTAImsnh11j41uOK";
	static final String accessKeySecret = "cJhYigBICw1Cr06gjAIRXqjd91EJAk";

	//
	public static void main(String[] args) {

		String phone = "13998641323" ;
		String code = RandomUtils.getRandomNum()+"" ;
		
		try {
			//大鱼
			sendCodeDyu(phone , code);
			
			//MNS
//			sendCodeMns(phone , code);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	}

	public static SendSmsResponse sendCodeDyu(String moblie, String code) throws Exception {

		// 可自助调整超时时间
		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
		System.setProperty("sun.net.client.defaultReadTimeout", "10000");

		// 初始化acsClient,暂不支持region化
		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
		IAcsClient acsClient = new DefaultAcsClient(profile);
		LOG.info("阿里大鱼加载配置信息------");
		// 组装请求对象-具体描述见控制台-文档部分内容
		SendSmsRequest request = new SendSmsRequest();
		// 必填:待发送手机号
		request.setPhoneNumbers(moblie);
		// 必填:短信签名-可在短信控制台中找到
		request.setSignName("米家园");
		// 必填:短信模板-可在短信控制台中找到
		request.setTemplateCode("SMS_109490326"); // 正式模版
		// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
		request.setTemplateParam("{\"code\":\""+code+"\"}");
		LOG.info("阿里大鱼设置请求参数------code :"+ code  );
		// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
		// request.setSmsUpExtendCode("90997");

		// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
		request.setOutId("yourOutId");

		// hint 此处可能会抛出异常，注意catch
		SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
		LOG.info("阿里大鱼发送完成------");
		return sendSmsResponse;

	}

	/**
	 * 发送短信验证码(阿里云短信) Mns 暂时不好用，
	 * 
	 * 不报异常，收不到短信
	 * 
	 * @param moblie
	 *            手机号码
	 * @param code
	 *            验证码
	 * @return
	 * @throws ApiException
	 */
	public static void sendCodeMns(String moblie, String code) throws Exception {
		// step1获取主题引用
		CloudAccount account = new CloudAccount("LTAIb0lGTVh4pKzi", "RfkdO7BaBnWBaD2IQiZiA1aYg12XAa",
				"http://1027689892031831.mns.cn-beijing.aliyuncs.com/");
		MNSClient client = account.getMNSClient();
		CloudTopic topic = client.getTopicRef("sms.topic-cn-beijing");
		// Step 2. 设置SMS消息体（必须） 注：目前暂时不支持消息内容为空，需要指定消息内容，不为空即可。
		RawTopicMessage msg = new RawTopicMessage();
		msg.setMessageBody("sms-subscription");
		LOG.info("阿里Mns 加载配置-------"  );
		
		// Step 3. 生成SMS消息属性
		MessageAttributes messageAttributes = new MessageAttributes();
		BatchSmsAttributes batchSmsAttributes = new BatchSmsAttributes();
		// 3.1 设置发送短信的签名（SMSSignName）
		batchSmsAttributes.setFreeSignName("首付易");
		// 3.2 设置发送短信使用的模板（SMSTempateCode）
		batchSmsAttributes.setTemplateCode("SMS_62835403");
		// 3.3 设置发送短信所使用的模板中参数对应的值（在短信模板中定义的，没有可以不用设置）
		BatchSmsAttributes.SmsReceiverParams smsReceiverParams = new BatchSmsAttributes.SmsReceiverParams();
		smsReceiverParams.setParam("code", code);
		smsReceiverParams.setParam("product", "商户管理平台");
		
		LOG.info("阿里Mns 模版、签名、数据设置-------"  );
		// 3.4 增加接收短信的号码
		batchSmsAttributes.addSmsReceiver(moblie, smsReceiverParams);
		// batchSmsAttributes.addSmsReceiver("18900964593", smsReceiverParams);
		// batchSmsAttributes.addSmsReceiver("$YourReceiverPhoneNumber2",
		// smsReceiverParams);
		messageAttributes.setBatchSmsAttributes(batchSmsAttributes);
		try {
			// Step 4. 发布SMS消息
			TopicMessage ret = topic.publishMessage(msg, messageAttributes);
			System.out.println("MessageId: " + ret.getMessageId());
			System.out.println("MessageMD5: " + ret.getMessageBodyMD5());
		} catch (ServiceException se) {
			System.out.println(se.getErrorCode() + se.getRequestId());
			System.out.println(se.getMessage());
			se.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		client.close();
		LOG.info("阿里Mns 短信发送完成-------"  );
	}

}
